/*
	单方向channel： 对于channel只能读操作或写操作
*/
package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

func main() {
	//创建2个channel
	ch1 := make(chan int)
	ch2 := make(chan int)
	//创建3个goroutine
	wg.Add(2)
	//借助一个知识点： channel关闭 10:25
	//counter
	go func(in chan<- int) {
		for i := 0; i < 10; i++ {
			in <- i
			time.Sleep(time.Second)
		}
		close(in)
		wg.Done()
	}(ch1)
	//squarer
	go func(out <-chan int, in chan<- int) {
		for {
			num, ok := <-out //ok代表指示器，指示channel是否关闭
			if !ok {
				//代表已经关闭
				break
			}
			in <- num * num
		}
		close(in)
		wg.Done()
	}(ch1, ch2)
	//printer
	for {
		num, ok := <-ch2
		if !ok {
			//代表已经关闭
			break
		}
		fmt.Println(num)
	}
	wg.Wait()
}
